#include "mytcpserver.h"
#include "mytcpsocket.h"
#include <QThread>
#include <QJsonObject>

MyTcpServer::MyTcpServer(QObject *parent)
    : QTcpServer{parent}
{


}

void MyTcpServer::incomingConnection(qintptr socketDescriptor)
{
    // 1. 每当有新连接时，创建一个新的线程
    QThread* thread = new QThread();

    // 2. 创建我们自己的MyTcpSocket 类实例,只传递参数
    MyTcpSocket* socket = new MyTcpSocket(socketDescriptor,this);

    // 3. 将 socket 移动到新线程中
    socket->moveToThread(thread);

    // 当线程启动时，自动调用 MyTcpSocket::init() 函数进行初始化
    connect(thread, &QThread::started, socket, &MyTcpSocket::init);

    // 4. 连接信号和槽，以确保线程和socket能被正确管理
    //    当线程启动时，我们再进行socket的初始化或其他操作（如果需要）
    //    connect(thread, &QThread::started, socket, &TcpSocket::someInitFunction);

    // 当 socket 发出 finished 信号时（我们自己定义的），意味着它完成了工作
    connect(socket, &MyTcpSocket::finished, thread, &QThread::quit);
    // 当 socket 销毁时，我们不需要手动 delete thread，因为...
    connect(socket, &MyTcpSocket::finished, socket, &MyTcpSocket::deleteLater);
    // 当线程结束后，自动销毁它自己
    connect(thread, &QThread::finished, thread, &QThread::deleteLater);

    // 5. 启动线程
    thread->start();

    return ;
}


void MyTcpServer::addOnlineUser(int userId, MyTcpSocket *socket)
{
    if (userId > 0 && socket)
    {
        m_onlineUsers.insert(userId, socket);
        qDebug() << "User" << userId << "is online. Total online users:" << m_onlineUsers.count();
    }
}

void MyTcpServer::removeOnlineUser(int userId)
{
    if (userId > 0) {
        m_onlineUsers.remove(userId);
        qDebug() << "User" << userId << "is offline. Total online users:" << m_onlineUsers.count();
    }
}
MyTcpSocket* MyTcpServer::findOnlineUser(int userId)
{
    // value() 函数如果找不到 key，会返回一个默认构造的 value (对于指针就是 nullptr)
    return m_onlineUsers.value(userId, nullptr);
}

void MyTcpServer::notifyFriendsOfStatusChange(int userId, const QString& username, const QString& status,const QList<QVariantMap>& friends)
{
    // 检查好友列表是否为空
    if (friends.isEmpty()) {
        return; // 没有好友, 无需通知
    }

    // 1. 构建状态更新的 JSON 消息体
    QJsonObject statusUpdateMsg;
    statusUpdateMsg["type"] = "friend_status_update";
    statusUpdateMsg["user_id"] = userId;
    statusUpdateMsg["username"] = username;
    statusUpdateMsg["status"] = status;

    // 2. 遍历传入的好友列表
    for (const auto& friendInfo : friends)
    {
        // 安全检查
        if (!friendInfo.contains("user_id"))
        {
            continue;
        }

        int friendId = friendInfo["user_id"].toInt();
        if (friendId <= 0)
        {
            continue;
        }

        // 3. 检查好友是否在线
        if (m_onlineUsers.contains(friendId))
        {
            MyTcpSocket* friendSocket = m_onlineUsers.value(friendId);

            // 4. 如果好友在线，就直接调用他的 socket 的发送函数
            if (friendSocket)
            {
                friendSocket->sendJsonResponse(statusUpdateMsg);
            }
        }
    }
    return ;
}

bool MyTcpServer::isUserOnline(int id)
{
    return this->m_onlineUsers.contains(id);
}
